/** 
 * @file Medida.java
 *
 * Implementación de una Medida.
 * 
 * @author Luis Ernesto Carrera Retana
 * @date 2009-11-29
 */

package estadistec.logica.tabla;

import estadistec.logica.tipos.TipoValor;
import estadistec.logica.dependencias.Nodo;
import estadistec.logica.gestores.Gestor;

import estadistec.logica.parser.IEvaluable;

import estadistec.excepciones.ExcepcionFormatoNumeros;
import estadistec.excepciones.ExcepcionMetodoInexistente;

/** 
 * Clase abstracta que va a servir para guardar el valor para cada uno de 
 * los diferentes tipos de medidas. Cada clase debe definir el constructor.
 *
 **/
public abstract class Medida<T> extends Nodo
{

	/** 
	 * Tabla de quien depende esta medida.
	 */
	protected LTabla _lTabla;

	/** 
	 * Versión de la clase para que sea serializable.
	 */
	static final long serialVersionUID = 1L;


	/** 
	 * Devuelve el tipo de valor.
	 */
	abstract public TipoValor getTipo ();

	/** 
	 * Devuelve el número de decimales que se muestran. Aplica cuando se
	 * utiliza punto flotante en la representación del valor.
	 *
	 * @throws ExcepcionMetodoInexistente El valor no utiliza punto flotante.
	 */
	abstract public int getNoDecimales() 
		throws ExcepcionMetodoInexistente;

	/** 
	 * Guarda de manera interna el número de decimales. Aplicable a aquellos
	 * atributos que utilizan punto flotante.
	 * 
	 * @param noDecimales Número de decimales
	 *
	 * @throws ExcepcionMetodoInexistente El atributo no utiliza punto flotante.
	 */
	abstract public void setNoDecimales (int noDecimales)
		throws ExcepcionMetodoInexistente;

	/** 
	 * Método que convierte el texto, en el valor correspondiente.
	 * 
	 * @param texto String del valor.
	 *
	 * @throws ExcepcionFormatoNumeros El texto no corresponde a un
	 * valor del tipo dado.
	 */
	abstract protected T _obtenerValor(String texto) 
		throws ExcepcionFormatoNumeros;

	/** 
	 * Método que devuelve un string a partir del valor. La implementación
	 * depende del tipo del atributo.
	 */
	abstract protected String _obtenerTexto(T valor);

	/** 
	 * Valor de la medida.
	 */
	protected T _valor;

	/** 
	 * Devuelve el valor.
	 */
	public T getValor() {
		return (this._valor);
	}

	/** 
	 * Método requerido por IEvaluable.
	 */
	public Object getValor(int indice) {
		return (this._valor);
	}

	/** 
	 * Método requerido por IEvaluable.
	 */
	public int getNoCasos() {
		return 1;
	}

	/** 
	 * Define o redefine un valor, a partir del valor dado.
	 * 
	 * @param valor Nuevo valor.
	 */
	abstract public void setValor(T valor);

	/**
	 * Método requerido por IEvaluable.
	 */
	public void setValor(int indice, Object valor) {
		setValor((T) valor);
	}

	/** 
	 * Define o redefine un valor, a partir de un texto.
	 * 
	 * @param textoValor Texto del valor.
	 * 
	 * @return El texto del valor dado.
	 *
	 * @throws ExcepcionFormatoNumeros @see _obtenerValor.
	 */
	public String set(String textoValor) 
	{
		this._valor = this._obtenerValor(textoValor);
		return (this._obtenerTexto(this._valor));
	};


	/** 
	 * Borra un valor.
	 */
	public void borrar() {
		this._valor = null;
	}


	/** 
	 * Devuelve el texto de los valores del atributo.
	 */
	public String getTextoValor() {
		return (this._obtenerTexto(this._valor));
	}

	protected void actualizarValor() {
	}

	public Gestor getGestor() {
		return this._lTabla;
	}

}
